# -*- coding: utf_8 -*-
# @Create   : 2021/9/7 16:37
# @Author   : yh
# @Remark   : 字段校验
import re
import time
from datetime import datetime
from typing import Union

from index import _


def base_re(data: str, re_expression: str, error: str):
    """
    正则匹配base方法
    :param data: 要匹配的数据
    :param re_expression: 正则表达式
    :param error: 错误信息
    """
    pattern = re.compile(re_expression)
    re_str = pattern.match(data)
    if re_str:
        return re_str.group()
    else:
        raise AssertionError(error)


def check_ipv4(ip: str) -> str:
    """
    校验IPv4
    """
    return base_re(ip, r'^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$', _("IPv4地址格式不正确"))


def check_ipv6(ip: str) -> str:
    """
    校验IPv6
    """
    # TODO IPv6校验


def check_ip(ip: str) -> str:
    """
    校验ip地址，符合ipv4或者ipv6
    """
    try:
        return check_ipv4(ip)
    except AssertionError:
        return check_ipv6(ip)

def check_mac(mac: str) -> str:
    """
    校验mac地址
    """
    return base_re(mac, r'^([0-9a-fA-F]{2})(([/\s:-][0-9a-fA-F]{2}){5})$', _("mac地址格式不正确"))


def check_time_str(date: str) -> int:
    """
    校验字符串是否符合时间格式
    :param date: 时间格式字符串（YYYY-mm-dd HH24:MM）
    :return: 时间戳（10位）
    """
    try:
        res = datetime.strptime(date, "%Y-%m-%d %H:%M")
    except ValueError:
        raise AssertionError(_('时间格式不符合，需要的格式：%%Y-%%m-%%d %%H:%%M，您的时间：%s') % date)
    return int(time.mktime(res.timetuple()))


def check_time_stamp(date: int) -> str:
    """
    将时间戳转为时间格式
    """
    return time.strftime("%Y-%m-%d %H:%M", time.localtime(date))


def check_code_int(code: Union[int, str, None]) -> Union[int, str]:
    """
    校验code是否能转为数字
    :param code: 可能不规范的code
    :return: 规范输出
    """
    if code is None or code == '':
        return ''

    if not str(code).isdigit():
        raise AssertionError(_('code：%s无法转为数字格式') % code)
    return int(code)


def check_data_list(data: str):
    """
    校验多个数据之间是否使用分号隔开
    :param data: 可能不规范的数据
    """
    return base_re(data, '([1-9a-zA-Z]+;)+', _('多条数据使用分号隔开'))


def check_mobile(mobile_number: Union[int, str]) -> str:
    """
    校验是否是手机号格式
    :param mobile_number: 手机号
    """
    return base_re(mobile_number, r'^1(3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$', _('手机号格式不正确'))


def check_email(email: str):
    """
    校验email是否符合格式
    """
    return base_re(email, r'^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$', _('邮箱格式不正确'))



